//
// Created by Ac on 2021/10/26.
//

#include <reg51.h>

sbit _switch = P3 ^3;
sbit clear = P3 ^4;

/**
 * 中断初始化
 */
void interrupt_init();

/**
 * 显示LED灯
 */
void led_display(void);

/**
 * 定时器 -> 设定 t = 1000us N = 1000 * 12M / 12 = 1000 X = 2^16 - N = 65536 - 1000 = 64536 => 0xfc18 即 高位fc 低位18
 */
void timer(void);

/**
 * 监听开关
 */
void eventKeys();

/**
 * 延时函数
 */
void delayMs(int sleep);

/**
 * LED灯对应显示字符
 */
unsigned char LED[] = {0x3f, 0x06, 0X5B, 0X4F, 0X66, 0X6D, 0X7D, 0x07, 0x7f, 0x6f};
/**
 * LED对应的位域 例 0111 1111 表示最后一盏灯亮,其他灭 0111 0111 表示第4盏和第8盏亮其他灭
 *
 * 0111 1111 0x7f 个位
 * 1011 1111 0xbf 十位
 */
unsigned char COM[] = {0x7f, 0xbf};
/**
 * 毫秒计数
 */
unsigned int millisecond = 0;
/**
 * 秒计数
 */
unsigned int second = 0;
/**
 * 设定要到达的秒数
 */
unsigned int setup = 99;

unsigned int status = 0;

int main(void) {
    // 中断配置初始化
    interrupt_init();
    while (1) {
        // LED灯显示
        eventKeys();
        led_display();
    }
}

void interrupt_init() {
    TMOD = 0x01;    // 定时器模式1
    TH0 = 0xfc;     // 高位
    TL0 = 0x18;     // 低位
    ET0 = 1;
    EA = 1;
    TR0 = 1;
}

void eventKeys() {
    if (_switch == 0 || clear == 0) {
        delayMs(110);
        if (_switch == 0 || clear == 0) {
            if (_switch == 0) {
                if (status) {
                    status = 0;
                } else {
                    status = 1;
                }
            }
            if (clear == 0) {
                second = 0;
            }
        }
    }
}

void led_display(void) {
    int cycle = millisecond % 2;    // 计算周期
    int sw = second / 10;           // 十位 例 59 / 10 = 5 小数溢出无效
    int gw = second % 10;           // 个位 例 59 % 10 = 9
    if (cycle == 0) {
        P1 = LED[gw];               // 显示个位
    } else {
        P1 = LED[sw];
    }
    P2 = COM[cycle];                // 对应位域
}

void timer(void)

interrupt 1 {
millisecond++;                        // 每次加1毫秒
if (status == 1) {
if (millisecond == 1000) {            // 1000毫秒 = 1秒
second++;                         // 加1秒
millisecond = 0;                  // 毫秒计数器归0
if (second == setup)
second = 0;  // 秒数归0
}
}
P1 = 0x00;                            // 清零,防止显示不全
TH0 = 0xfc;                           // 高位复位
TL0 = 0x18;                           // 低位复位
}

void delayMs(int sleep) {
    unsigned char i;
    while (sleep--) {
        for (i = 0; i < 123; ++i);
    }
}